<?php
/**
 * Created by PhpStorm.
 * Time: 上午10:12
 * Description:
 */

namespace ServiceSdk\Utils\Common;

use ServiceSdk\Libs\SdkConstants;
use ServiceSdk\Services\BaseService;

class UtilTools extends BaseService
{
    /**
     * 给用户自动生成昵称
     *
     * @param int $type 1生成昵称，2生成姓名
     *
     * @return mixed|string
     */
    public static function createChineseNickname($type = 1)
    {
        /**
         * 随机昵称 形容词
         */
        $nicknameFirst = [
            '迷你的',
            '鲜艳的',
            '飞快的',
            '真实的',
            '清新的',
            '幸福的',
            '可耐的',
            '快乐的',
            '冷静的',
            '醉熏的',
            '潇洒的',
            '糊涂的',
            '积极的',
            '冷酷的',
            '深情的',
            '粗暴的',
            '温柔的',
            '可爱的',
            '愉快的',
            '义气的',
            '认真的',
            '威武的',
            '帅气的',
            '传统的',
            '潇洒的',
            '漂亮的',
            '自然的',
            '专一的',
            '听话的',
            '昏睡的',
            '狂野的',
            '等待的',
            '搞怪的',
            '幽默的',
            '魁梧的',
            '活泼的',
            '开心的',
            '高兴的',
            '超帅的',
            '留胡子的',
            '坦率的',
            '直率的',
            '轻松的',
            '痴情的',
            '完美的',
            '精明的',
            '无聊的',
            '有魅力的',
            '丰富的',
            '繁荣的',
            '饱满的',
            '炙热的',
            '暴躁的',
            '碧蓝的',
            '俊逸的',
            '英勇的',
            '健忘的',
            '故意的',
            '无心的',
            '土豪的',
            '朴实的',
            '兴奋的',
            '幸福的',
            '淡定的',
            '不安的',
            '阔达的',
            '孤独的',
            '独特的',
            '疯狂的',
            '时尚的',
            '落后的',
            '风趣的',
            '忧伤的',
            '大胆的',
            '爱笑的',
            '矮小的',
            '健康的',
            '合适的',
            '玩命的',
            '沉默的',
            '斯文的',
            '香蕉',
            '苹果',
            '鲤鱼',
            '鳗鱼',
            '任性的',
            '细心的',
            '粗心的',
            '大意的',
            '甜甜的',
            '酷酷的',
            '健壮的',
            '英俊的',
            '霸气的',
            '阳光的',
            '默默的',
            '大力的',
            '孝顺的',
            '忧虑的',
            '着急的',
            '紧张的',
            '善良的',
            '凶狠的',
            '害怕的',
            '重要的',
            '危机的',
            '欢喜的',
            '欣慰的',
            '满意的',
            '跳跃的',
            '诚心的',
            '称心的',
            '如意的',
            '怡然的',
            '娇气的',
            '无奈的',
            '无语的',
            '激动的',
            '愤怒的',
            '美好的',
            '感动的',
            '激情的',
            '激昂的',
            '震动的',
            '虚拟的',
            '超级的',
            '寒冷的',
            '精明的',
            '明理的',
            '犹豫的',
            '忧郁的',
            '寂寞的',
            '奋斗的',
            '勤奋的',
            '现代的',
            '过时的',
            '稳重的',
            '热情的',
            '含蓄的',
            '开放的',
            '无辜的',
            '多情的',
            '纯真的',
            '拉长的',
            '热心的',
            '从容的',
            '体贴的',
            '风中的',
            '曾经的',
            '追寻的',
            '儒雅的',
            '优雅的',
            '开朗的',
            '外向的',
            '内向的',
            '清爽的',
            '文艺的',
            '长情的',
            '平常的',
            '单身的',
            '伶俐的',
            '高大的',
            '懦弱的',
            '柔弱的',
            '爱笑的',
            '乐观的',
            '耍酷的',
            '酷炫的',
            '神勇的',
            '年轻的',
            '唠叨的',
            '瘦瘦的',
            '无情的',
            '包容的',
            '顺心的',
            '畅快的',
            '舒适的',
            '靓丽的',
            '负责的',
            '背后的',
            '简单的',
            '谦让的',
            '彩色的',
            '缥缈的',
            '欢呼的',
            '生动的',
            '复杂的',
            '慈祥的',
            '仁爱的',
            '魔幻的',
            '虚幻的',
            '淡然的',
            '受伤的',
            '雪白的',
            '高高的',
            '糟糕的',
            '顺利的',
            '闪闪的',
            '羞涩的',
            '缓慢的',
            '迅速的',
            '优秀的',
            '聪明的',
            '含糊的',
            '俏皮的',
            '淡淡的',
            '坚强的',
            '平淡的',
            '欣喜的',
            '能干的',
            '灵巧的',
            '友好的',
            '机智的',
            '机灵的',
            '正直的',
            '谨慎的',
            '俭朴的',
            '殷勤的',
            '虚心的',
            '辛勤的',
            '自觉的',
            '无私的',
            '无限的',
            '踏实的',
            '老实的',
            '现实的',
            '可靠的',
            '务实的',
            '拼搏的',
            '个性的',
            '粗犷的',
            '活力的',
            '成就的',
            '勤劳的',
            '单纯的',
            '落寞的',
            '朴素的',
            '悲凉的',
            '忧心的',
            '洁净的',
            '清秀的',
            '自由的',
            '小巧的',
            '单薄的',
            '贪玩的',
            '刻苦的',
            '干净的',
            '壮观的',
            '和谐的',
            '文静的',
            '调皮的',
            '害羞的',
            '安详的',
            '自信的',
            '端庄的',
            '坚定的',
            '美满的',
            '舒心的',
            '温暖的',
            '专注的',
            '勤恳的',
            '美丽的',
            '腼腆的',
            '优美的',
            '甜美的',
            '甜蜜的',
            '整齐的',
            '动人的',
            '典雅的',
            '尊敬的',
            '舒服的',
            '妩媚的',
            '秀丽的',
            '喜悦的',
            '甜美的',
            '彪壮的',
            '强健的',
            '大方的',
            '俊秀的',
            '聪慧的',
            '迷人的',
            '陶醉的',
            '悦耳的',
            '动听的',
            '明亮的',
            '结实的',
            '魁梧的',
            '标致的',
            '清脆的',
            '敏感的',
            '光亮的',
            '大气的',
            '老迟到的',
            '知性的',
            '冷傲的',
            '呆萌的',
            '野性的',
            '隐形的',
            '笑点低的',
            '微笑的',
            '笨笨的',
            '难过的',
            '沉静的',
            '火星上的',
            '失眠的',
            '安静的',
            '纯情的',
            '要减肥的',
            '迷路的',
            '烂漫的',
            '哭泣的',
            '贤惠的',
            '苗条的',
            '温婉的',
            '发嗲的',
            '会撒娇的',
            '贪玩的',
            '执着的',
            '眯眯眼的',
            '花痴的',
            '想人陪的',
            '眼睛大的',
            '高贵的',
            '傲娇的',
            '心灵美的',
            '爱撒娇的',
            '细腻的',
            '天真的',
            '怕黑的',
            '感性的',
            '飘逸的',
            '怕孤独的',
            '忐忑的',
            '高挑的',
            '傻傻的',
            '冷艳的',
            '爱听歌的',
            '还单身的',
            '怕孤单的',
            '懵懂的'
        ];
        $nicknameSecond = [
            '嚓茶',
            '皮皮虾',
            '皮卡丘',
            '马里奥',
            '小霸王',
            '凉面',
            '便当',
            '毛豆',
            '花生',
            '可乐',
            '灯泡',
            '哈密瓜',
            '野狼',
            '背包',
            '眼神',
            '缘分',
            '雪碧',
            '人生',
            '牛排',
            '蚂蚁',
            '飞鸟',
            '灰狼',
            '斑马',
            '汉堡',
            '悟空',
            '巨人',
            '绿茶',
            '自行车',
            '保温杯',
            '大碗',
            '墨镜',
            '魔镜',
            '煎饼',
            '月饼',
            '月亮',
            '星星',
            '芝麻',
            '啤酒',
            '玫瑰',
            '大叔',
            '小伙',
            '哈密瓜，数据线',
            '太阳',
            '树叶',
            '芹菜',
            '黄蜂',
            '蜜粉',
            '蜜蜂',
            '信封',
            '西装',
            '外套',
            '裙子',
            '大象',
            '猫咪',
            '母鸡',
            '路灯',
            '蓝天',
            '白云',
            '星月',
            '彩虹',
            '微笑',
            '摩托',
            '板栗',
            '高山',
            '大地',
            '大树',
            '电灯胆',
            '砖头',
            '楼房',
            '水池',
            '鸡翅',
            '蜻蜓',
            '红牛',
            '咖啡',
            '机器猫',
            '枕头',
            '大船',
            '诺言',
            '钢笔',
            '刺猬',
            '天空',
            '飞机',
            '大炮',
            '冬天',
            '洋葱',
            '春天',
            '夏天',
            '秋天',
            '冬日',
            '航空',
            '毛衣',
            '豌豆',
            '黑米',
            '玉米',
            '眼睛',
            '老鼠',
            '白羊',
            '帅哥',
            '美女',
            '季节',
            '鲜花',
            '服饰',
            '裙子',
            '白开水',
            '秀发',
            '大山',
            '火车',
            '汽车',
            '歌曲',
            '舞蹈',
            '老师',
            '导师',
            '方盒',
            '大米',
            '麦片',
            '水杯',
            '水壶',
            '手套',
            '鞋子',
            '自行车',
            '鼠标',
            '手机',
            '电脑',
            '书本',
            '奇迹',
            '身影',
            '香烟',
            '夕阳',
            '台灯',
            '宝贝',
            '未来',
            '皮带',
            '钥匙',
            '心锁',
            '故事',
            '花瓣',
            '滑板',
            '画笔',
            '画板',
            '学姐',
            '店员',
            '电源',
            '饼干',
            '宝马',
            '过客',
            '大白',
            '时光',
            '石头',
            '钻石',
            '河马',
            '犀牛',
            '西牛',
            '绿草',
            '抽屉',
            '柜子',
            '往事',
            '寒风',
            '路人',
            '橘子',
            '耳机',
            '鸵鸟',
            '朋友',
            '苗条',
            '铅笔',
            '钢笔',
            '硬币',
            '热狗',
            '大侠',
            '御姐',
            '萝莉',
            '毛巾',
            '期待',
            '盼望',
            '白昼',
            '黑夜',
            '大门',
            '黑裤',
            '钢铁侠',
            '哑铃',
            '板凳',
            '枫叶',
            '荷花',
            '乌龟',
            '仙人掌',
            '衬衫',
            '大神',
            '草丛',
            '早晨',
            '心情',
            '茉莉',
            '流沙',
            '蜗牛',
            '战斗机',
            '冥王星',
            '猎豹',
            '棒球',
            '篮球',
            '乐曲',
            '电话',
            '网络',
            '世界',
            '中心',
            '鱼',
            '鸡',
            '狗',
            '老虎',
            '鸭子',
            '雨',
            '羽毛',
            '翅膀',
            '外套',
            '火',
            '丝袜',
            '书包',
            '钢笔',
            '冷风',
            '八宝粥',
            '烤鸡',
            '大雁',
            '音响',
            '招牌',
            '胡萝卜',
            '冰棍',
            '帽子',
            '菠萝',
            '蛋挞',
            '香水',
            '泥猴桃',
            '吐司',
            '溪流',
            '黄豆',
            '樱桃',
            '小鸽子',
            '小蝴蝶',
            '爆米花',
            '花卷',
            '小鸭子',
            '小海豚',
            '日记本',
            '小熊猫',
            '小懒猪',
            '小懒虫',
            '荔枝',
            '镜子',
            '曲奇',
            '金针菇',
            '小松鼠',
            '小虾米',
            '酒窝',
            '紫菜',
            '金鱼',
            '柚子',
            '果汁',
            '百褶裙',
            '项链',
            '帆布鞋',
            '火龙果',
            '奇异果',
            '煎蛋',
            '唇彩',
            '小土豆',
            '高跟鞋',
            '戒指',
            '雪糕',
            '睫毛',
            '铃铛',
            '手链',
            '香氛',
            '红酒',
            '月光',
            '酸奶',
            '银耳汤',
            '咖啡豆',
            '小蜜蜂',
            '小蚂蚁',
            '蜡烛',
            '棉花糖',
            '向日葵',
            '水蜜桃',
            '小蝴蝶',
            '小刺猬',
            '小丸子',
            '指甲油',
            '康乃馨',
            '糖豆',
            '薯片',
            '口红',
            '超短裙',
            '乌冬面',
            '冰淇淋',
            '棒棒糖',
            '长颈鹿',
            '豆芽',
            '发箍',
            '发卡',
            '发夹',
            '发带',
            '铃铛',
            '小馒头',
            '小笼包',
            '小甜瓜',
            '冬瓜',
            '香菇',
            '小兔子',
            '含羞草',
            '短靴',
            '睫毛膏',
            '小蘑菇',
            '跳跳糖',
            '小白菜',
            '草莓',
            '柠檬',
            '月饼',
            '百合',
            '纸鹤',
            '小天鹅',
            '云朵',
            '芒果',
            '面包',
            '海燕',
            '小猫咪',
            '龙猫',
            '唇膏',
            '鞋垫',
            '羊',
            '黑猫',
            '白猫',
            '万宝路',
            '金毛',
            '山水',
            '音响',
            '纸飞机',
            '烧鹅'
        ];
        /**
         * 百家姓
         */
        $firstName = [
            '赵',
            '钱',
            '孙',
            '李',
            '周',
            '吴',
            '郑',
            '王',
            '冯',
            '陈',
            '褚',
            '卫',
            '蒋',
            '沈',
            '韩',
            '杨',
            '朱',
            '秦',
            '尤',
            '许',
            '何',
            '吕',
            '施',
            '张',
            '孔',
            '曹',
            '严',
            '华',
            '金',
            '魏',
            '陶',
            '姜',
            '戚',
            '谢',
            '邹',
            '喻',
            '柏',
            '水',
            '窦',
            '章',
            '云',
            '苏',
            '潘',
            '葛',
            '奚',
            '范',
            '彭',
            '郎',
            '鲁',
            '韦',
            '昌',
            '马',
            '苗',
            '凤',
            '花',
            '方',
            '任',
            '袁',
            '柳',
            '鲍',
            '史',
            '唐',
            '费',
            '薛',
            '雷',
            '贺',
            '倪',
            '汤',
            '滕',
            '殷',
            '罗',
            '毕',
            '郝',
            '安',
            '常',
            '傅',
            '卞',
            '齐',
            '元',
            '顾',
            '孟',
            '平',
            '黄',
            '穆',
            '萧',
            '尹',
            '姚',
            '邵',
            '湛',
            '汪',
            '祁',
            '毛',
            '狄',
            '米',
            '伏',
            '成',
            '戴',
            '谈',
            '宋',
            '茅',
            '庞',
            '熊',
            '纪',
            '舒',
            '屈',
            '项',
            '祝',
            '董',
            '梁',
            '杜',
            '阮',
            '蓝',
            '闵',
            '季',
            '贾',
            '路',
            '娄',
            '江',
            '童',
            '颜',
            '郭',
            '梅',
            '盛',
            '林',
            '钟',
            '徐',
            '邱',
            '骆',
            '高',
            '夏',
            '蔡',
            '田',
            '樊',
            '胡',
            '凌',
            '霍',
            '虞',
            '万',
            '支',
            '柯',
            '管',
            '卢',
            '莫',
            '柯',
            '房',
            '裘',
            '缪',
            '解',
            '应',
            '宗',
            '丁',
            '宣',
            '邓',
            '单',
            '杭',
            '洪',
            '包',
            '诸',
            '左',
            '石',
            '崔',
            '吉',
            '龚',
            '程',
            '嵇',
            '邢',
            '裴',
            '陆',
            '荣',
            '翁',
            '荀',
            '于',
            '惠',
            '甄',
            '曲',
            '封',
            '储',
            '仲',
            '伊',
            '宁',
            '仇',
            '甘',
            '武',
            '符',
            '刘',
            '景',
            '詹',
            '龙',
            '叶',
            '幸',
            '司',
            '黎',
            '溥',
            '印',
            '怀',
            '蒲',
            '邰',
            '从',
            '索',
            '赖',
            '卓',
            '屠',
            '池',
            '乔',
            '胥',
            '闻',
            '莘',
            '党',
            '翟',
            '谭',
            '贡',
            '劳',
            '逄',
            '姬',
            '申',
            '扶',
            '堵',
            '冉',
            '宰',
            '雍',
            '桑',
            '寿',
            '通',
            '燕',
            '浦',
            '尚',
            '农',
            '温',
            '别',
            '庄',
            '晏',
            '柴',
            '瞿',
            '阎',
            '连',
            '习',
            '容',
            '向',
            '古',
            '易',
            '廖',
            '庾',
            '终',
            '步',
            '都',
            '耿',
            '满',
            '弘',
            '匡',
            '国',
            '文',
            '寇',
            '广',
            '禄',
            '阙',
            '东',
            '欧',
            '利',
            '师',
            '巩',
            '聂',
            '关',
            '荆',
            '司马',
            '上官',
            '欧阳',
            '夏侯',
            '诸葛',
            '闻人',
            '东方',
            '赫连',
            '皇甫',
            '尉迟',
            '公羊',
            '澹台',
            '公冶',
            '宗政',
            '濮阳',
            '淳于',
            '单于',
            '太叔',
            '申屠',
            '公孙',
            '仲孙',
            '轩辕',
            '令狐',
            '徐离',
            '宇文',
            '长孙',
            '慕容',
            '司徒',
            '司空',
            '皮'
        ];
        /**
         * 名
         */
        $lastName = [
            '伟',
            '刚',
            '勇',
            '毅',
            '俊',
            '峰',
            '强',
            '军',
            '平',
            '保',
            '东',
            '文',
            '辉',
            '力',
            '明',
            '永',
            '健',
            '世',
            '广',
            '志',
            '义',
            '兴',
            '良',
            '海',
            '山',
            '仁',
            '波',
            '宁',
            '贵',
            '福',
            '生',
            '龙',
            '元',
            '全',
            '国',
            '胜',
            '学',
            '祥',
            '才',
            '发',
            '武',
            '新',
            '利',
            '清',
            '飞',
            '彬',
            '富',
            '顺',
            '信',
            '子',
            '杰',
            '涛',
            '昌',
            '成',
            '康',
            '星',
            '光',
            '天',
            '达',
            '安',
            '岩',
            '中',
            '茂',
            '进',
            '林',
            '有',
            '坚',
            '和',
            '彪',
            '博',
            '诚',
            '先',
            '敬',
            '震',
            '振',
            '壮',
            '会',
            '思',
            '群',
            '豪',
            '心',
            '邦',
            '承',
            '乐',
            '绍',
            '功',
            '松',
            '善',
            '厚',
            '庆',
            '磊',
            '民',
            '友',
            '裕',
            '河',
            '哲',
            '江',
            '超',
            '浩',
            '亮',
            '政',
            '谦',
            '亨',
            '奇',
            '固',
            '之',
            '轮',
            '翰',
            '朗',
            '伯',
            '宏',
            '言',
            '若',
            '鸣',
            '朋',
            '斌',
            '梁',
            '栋',
            '维',
            '启',
            '克',
            '伦',
            '翔',
            '旭',
            '鹏',
            '泽',
            '晨',
            '辰',
            '士',
            '以',
            '建',
            '家',
            '致',
            '树',
            '炎',
            '德',
            '行',
            '时',
            '泰',
            '盛',
            '雄',
            '琛',
            '钧',
            '冠',
            '策',
            '腾',
            '楠',
            '榕',
            '风',
            '航',
            '弘',
            '秀',
            '娟',
            '英',
            '华',
            '慧',
            '巧',
            '美',
            '娜',
            '静',
            '淑',
            '惠',
            '珠',
            '翠',
            '雅',
            '芝',
            '玉',
            '萍',
            '红',
            '娥',
            '玲',
            '芬',
            '芳',
            '燕',
            '彩',
            '春',
            '菊',
            '兰',
            '凤',
            '洁',
            '梅',
            '琳',
            '素',
            '云',
            '莲',
            '真',
            '环',
            '雪',
            '荣',
            '爱',
            '妹',
            '霞',
            '香',
            '月',
            '莺',
            '媛',
            '艳',
            '瑞',
            '凡',
            '佳',
            '嘉',
            '琼',
            '勤',
            '珍',
            '贞',
            '莉',
            '桂',
            '娣',
            '叶',
            '璧',
            '璐',
            '娅',
            '琦',
            '晶',
            '妍',
            '茜',
            '秋',
            '珊',
            '莎',
            '锦',
            '黛',
            '青',
            '倩',
            '婷',
            '姣',
            '婉',
            '娴',
            '瑾',
            '颖',
            '露',
            '瑶',
            '怡',
            '婵',
            '雁',
            '蓓',
            '纨',
            '仪',
            '荷',
            '丹',
            '蓉',
            '眉',
            '君',
            '琴',
            '蕊',
            '薇',
            '菁',
            '梦',
            '岚',
            '苑',
            '婕',
            '馨',
            '瑗',
            '琰',
            '韵',
            '融',
            '园',
            '艺',
            '咏',
            '卿',
            '聪',
            '澜',
            '纯',
            '毓',
            '悦',
            '昭',
            '冰',
            '爽',
            '琬',
            '茗',
            '羽',
            '希',
            '欣',
            '飘',
            '育',
            '滢',
            '馥',
            '筠',
            '柔',
            '竹',
            '霭',
            '凝',
            '晓',
            '欢',
            '霄',
            '枫',
            '芸',
            '菲',
            '寒',
            '伊',
            '亚',
            '宜',
            '可',
            '姬',
            '舒',
            '影',
            '荔',
            '枝',
            '丽',
            '阳',
            '妮',
            '宝',
            '贝',
            '初',
            '程',
            '梵',
            '罡',
            '恒',
            '鸿',
            '桦',
            '骅',
            '剑',
            '娇',
            '纪',
            '宽',
            '苛',
            '灵',
            '玛',
            '媚',
            '琪',
            '晴',
            '容',
            '睿',
            '烁',
            '堂',
            '唯',
            '威',
            '韦',
            '雯',
            '苇',
            '萱',
            '阅',
            '彦',
            '宇',
            '雨',
            '洋',
            '忠',
            '宗',
            '曼',
            '紫',
            '逸',
            '贤',
            '蝶',
            '菡',
            '绿',
            '蓝',
            '儿',
            '翠',
            '烟'
        ];
        switch ($type) {
            case 1:
                $nickFirstCount = rand(0, count($nicknameFirst) - 1);
                $nickLastCount = rand(0, count($nicknameSecond) - 1);
                $nickname = $nicknameFirst[$nickFirstCount] . $nicknameSecond[$nickLastCount];
            break;
            case 2:
                $nickname = $firstName[mt_rand(0, count($firstName) - 1)];
                for ($i = 1; $i <= 3; $i++) {
                    $nickname .= (mt_rand(0, 1) ? $lastName[mt_rand(0, count($lastName) - 1)] : $lastName[mt_rand(0, count($lastName) - 1)]);
                }
            break;
            default:
                $nickFirstCount = rand(0, count($nicknameFirst) - 1);
                $nickLastCount = rand(0, count($nicknameSecond) - 1);
                $nickname = $nicknameFirst[$nickFirstCount] . $nicknameSecond[$nickLastCount];
        }

        return $nickname;
    }

    /**
     * Description: 获取后台登录用户的userId
     * @return mixed
     * @Author itworker
     * @Time   2021/8/8 7:50
     */
    public static function getAdminUserId()
    {
        $adminUserId = request(SdkConstants::SYS_ADMIN_LOGIN_USER_ID, 0);

        return empty($adminUserId) ? request(SdkConstants::SYS_ADMIN_LOGIN_USER_ID_ALIAS, 0) : $adminUserId;
    }

    /**
     * Description: 获取前台登录用户的uuid
     * @return mixed
     * @Author itworker
     * @Time   2021/8/8 7:50
     */
    public static function getFrontUserUuid()
    {
        $uuid = request(SdkConstants::SYS_FRONT_LOGIN_USER_UUID, '');

        return empty($uuid) ? request(SdkConstants::SYS_FRONT_LOGIN_USER_UUID_ALIAS, '') : $uuid;
    }

    /**
     * Description: 获取前台登录用户的userId
     * @return mixed
     * @Author itworker
     * @Time   2021/8/8 7:50
     */
    public static function getFrontUserId()
    {
        $userId = request(SdkConstants::SYS_FRONT_LOGIN_USER_ID, 0);

        return empty($userId) ? request(SdkConstants::SYS_FRONT_LOGIN_USER_ID_ALIAS, 0) : $userId;
    }

    /**
     * Description: 获取当前请求服务的平台
     * @return mixed
     * @Author itworker
     * @Time   2021/8/8 7:50
     */
    public static function getRequestPlatform()
    {
        return request(SdkConstants::REQUEST_CLIENT_NAME, '');
    }

    /**
     * Description:获取当前请求的客户端ip
     * @return array|\Illuminate\Http\Request|string|null
     * @Author itworker
     * @Time   2021/8/13 6:43
     */
    public static function getRequestClientIp()
    {
        $ip = request(SdkConstants::REQUEST_CLIENT_IP, '');

        return empty($ip) ? request()->ip() : $ip;
    }

    /**
     * Description:获取当前请求的客户端User-Agent
     * @return array|\Illuminate\Http\Request|string|null
     * @Author itworker
     * @Time   2021/8/13 6:43
     */
    public static function getRequestClientUserAgent()
    {
        $userAgent = request(SdkConstants::REQUEST_CLIENT_USER_AGENT, '');

        return empty($userAgent) ? request()->userAgent() : $userAgent;
    }

    /**
     * Description: 生成多个唯一字符串，默认生成12位随机唯一id，如果其他长度，需要在 $addchars 定义随机字符串，此字符串会
     *              追加到已生成的字符串开头，组成新的字符串。
     *
     *              【注：】可支持校验数据库，传入模型完整路径和要校验的字段即可验证是否唯一，如果有重复
     *                     会自动重新生成，最多尝试10次
     *
     * @param string $addchars   自定义字符
     * @param string $connection 数据库连接名，默认mysql
     * @param string $tableName  数据表名称
     * @param int $num           生成id的数量  最多一次生成100个
     * @param string $appType    当前项目的框架类型，默认laravel 此配置将影响数据库唯一性校验的数据db链接
     * @param array $dbOptions   如果数据库链接配置为 other，则使用默认mysqli扩展查询
     *
     * @return array
     */
    public static function createUniqueId(
        string $addchars = '',
        ?string $connection = 'mysql',
        string $tableName = '',
        int $num = 1,
        $appType = 'laravel',
        array $dbOptions = []
    ): array {
        $uniqueNumArray = [];
        $connection = empty($connection) ? 'mysql' : $connection;
        do {
            $uniqueNums = [];
            while (true) {
                if (count($uniqueNums) >= ($num - count($uniqueNumArray))) {
                    break;
                }
                $nowmics = explode(' ', microtime());
                $sec = substr('00' . base_convert(substr(($nowmics[1] - 1420041600), -9), 10, 36), -6);
                $msec = substr('00' . base_convert(substr($nowmics[0], 2, -2), 10, 36), -4);
                $randStr = base_convert(mt_rand(0, 35), 10, 36) . base_convert(mt_rand(0, 35), 10, 36);
                $string = $addchars . $sec . $msec . $randStr;
                if (! in_array($string, $uniqueNumArray, true)) {
                    $uniqueNums[] = $string;
                }
            }
            if (! empty($tableName) && ! empty($connection)) {
                $uniqueNums = self::checkExisted($connection, $tableName, $uniqueNums, $appType, $dbOptions);
            }
            $uniqueNumArray = array_merge($uniqueNumArray, $uniqueNums);
            unset($uniqueNums);
            if (count($uniqueNumArray) >= $num) {
                break;
            }
        } while (true);

        return $uniqueNumArray;
    }

    /**
     * Description: 分页
     *
     * @param string $connection
     * @param string $tableName
     * @param array $uniqueIds
     * @param string $frameType
     * @param array $dbOptions 如果数据库链接配置为 other，则使用默认mysqli扩展查询
     *
     * @return array
     */
    private static function checkExisted(
        string $connection,
        string $tableName,
        array $uniqueIds,
        string $frameType = 'laravel',
        array $dbOptions = []
    ) {
        $return = [];
        $pageSize = 500;
        $chunkArray = array_chunk($uniqueIds, $pageSize);
        switch (strtolower($frameType)) {
            case 'other':
                $host = $dbOptions['host'] ?? '';
                $user = $dbOptions['user'] ?? '';
                $password = $dbOptions['password'] ?? '';
                $dbName = $dbOptions['db_name'] ?? '';
                $port = $dbOptions['port'] ?? 3306;
                $link = new \Mysqli($host, $user, $password, $dbName, $port);
                if ($link) {
                    foreach ($chunkArray as $sliceArray) {
                        $idString = '\'' . implode('\',\'', $sliceArray) . '\'';
                        $result = $link->query("SELECT `id` FROM {$tableName} WHERE `id` IN ({$idString})");
                        $exits = [];
                        if ($result && $result->num_rows > 0) {
                            while ($res = $result->fetch_assoc()) {
                                $exits[] = $res['id'];
                            }
                        }
                        unset($result);
                        if (! empty($exits)) {
                            $return = array_merge($return, array_diff($sliceArray, $exits));
                            unset($exits);
                        } else {
                            $return = array_merge($return, $sliceArray);
                        }
                    }
                }
                $link->close();
            break;
            case 'thinkphp3':
                if (function_exists('M')) {
                    foreach ($chunkArray as $sliceArray) {
                        $ids = M('', '', $connection)
                            ->table($tableName)
                            ->field('id')
                            ->where(['id' => ['in', $sliceArray]])
                            ->select();
                        if (! empty($ids)) {
                            $ids = self::object2array($ids->toArray());
                            $ids = array_column($ids, 'id');
                            $return = array_merge($return, array_diff($sliceArray, $ids));
                        } else {
                            $return = array_merge($return, $sliceArray);
                        }
                    }
                }
            break;
            case 'laravel':
            default:
                if (class_exists('\Illuminate\Support\Facades\DB')) {
                    foreach ($chunkArray as $sliceArray) {
                        $ids = \Illuminate\Support\Facades\DB::connection($connection)
                                                             ->table($tableName)
                                                             ->whereIn('id', $sliceArray)
                                                             ->select('id')
                                                             ->get();
                        if (! $ids->isEmpty()) {
                            $ids = self::object2array($ids->toArray());
                            $ids = array_column($ids, 'id');
                            $return = array_merge($return, array_diff($sliceArray, $ids));
                        } else {
                            $return = array_merge($return, $sliceArray);
                        }
                    }
                }
        }

        return $return;
    }

    /**
     * Description: 获取一个唯一字段，可支持表验证，生成的字符串长度为12位
     *
     * @param string $addchars   附加字符，如果长度不够，可以自行生成随机字符串传入，传入后会附加到系统生成的字符串前
     * @param string $connection 表连接名，如果要验证数据库中是否存在此字段，则需要传入此字段
     * @param string $tableName  表名，如果要验证数据库中是否存在此字段，则需要传入此字段
     * @param string $appType    系统应用的框架类型，默认laravel，
     *                           比如当前系统是laravel框架，thinkphp框架等，需要指定，
     *                           现在支持的框架类型如下：
     *                           laravel, thinkphp3,thinkphp5,default
     *
     * @return string
     * @Author : Bililovy
     * @todo   其中，default表示没有任何框架，当没有使用任何框架时，需要单独开发验证逻辑
     *
     */
    public static function createOneUniqueId(
        string $addchars = '',
        ?string $connection = 'mysql',
        string $tableName = '',
        string $appType = 'laravel'
    ): string {
        $uniqueString = '';
        $strings = self::createUniqueId($addchars, $connection, $tableName, 1, $appType);
        if (! empty($strings)) {
            $uniqueString = reset($strings);
        }

        return $uniqueString;
    }

    /**
     * Description: 随机生成管理者id，如果不传入 $model 模型，则直接随机生成10位且不会校验去重
     *              如果传入 地区$regionCode 和 $model 则会根据$regionCode生成id，且会去指定模型中校验是否存在
     *
     * @param string $model      传入模型的完整路径  模型中要实现 getMangerCollections($regionCode);方法
     *
     *                           可参照如下方法：
     *
     *                           public static function getMangerCollections(string $regionCode = ''): array
     *                           {
     *                               $return = [];
     *                               if ( ! empty($regionCode)) {
     *                               $regionCodeMin = intval($regionCode) * 10000;
     *                               $regionCodeMax = $regionCodeMin + 9999;
     *                               $result = 从库里查出 regionCode>=$regionCodeMin && regionCode<=$regionCodeMax
     *                                         的所有地区编码
     *                              if ( ! empty($result)) {
     *                                      $return = array_column($result, 'manager_num');
     *                                  }
     *                              }
     *
     *                              return $return;
     *                          }
     *
     * @param string $regionCode 地区code 根据此code生成管理者id
     *
     * @return string
     */
    public static function createManagerId(string $model = null, string $regionCode = '')
    {
        $str = '';
        if (! empty($regionCode) && ! empty($model)) {
            $managerIdCollections = $model::getMangerCollections($regionCode);
            $regionCodeMin = intval($regionCode) * 10000;
            $regionCodeMax = $regionCodeMin + 9999;
            $collect = [];
            while ($regionCodeMin < $regionCodeMax) {
                $regionCodeMin++;
                $collect[] = $regionCodeMin;
            }
            $unusedCollect = array_diff($collect, $managerIdCollections);
            reset($unusedCollect);
            if (count($unusedCollect)) {
                $str = current($unusedCollect);
            }
            unset($managerIdCollections, $regionCodeMin, $regionCodeMax, $collect, $unusedCollect);
        } else {
            $str = substr(str_shuffle(substr(intval(microtime(true) * 10000) + mt_rand(1000000000, 9999999999), 4) . date('His')), 0, 10);
            $len = strlen($str);
            if ($len < 10) {
                // 如果没有到10位，则重新随机生成其他位数作补充
                $needle = 10 - $len;
                $str .= mt_rand(intval(str_pad('1', $needle - 1, 0, STR_PAD_RIGHT)), intval(str_pad('9', $needle - 1, 9, STR_PAD_RIGHT)));
            }
        }

        return strval($str);
    }

    /**
     * 数组转为对象，只支持一维数组转换，如果是多维数组，而为以上将会原样返回
     *
     * @param array $array
     *
     * @return array|\StdClass
     */
    public static function array2object(array $array)
    {
        if (is_array($array)) {
            $obj = new \StdClass();
            foreach ($array as $key => $val) {
                $obj->$key = $val;
            }
        } else {
            $obj = $array;
        }

        return $obj;
    }

    /**
     * 数组转为对象，支持多维数组，最终返回一维数组
     *
     * @param object $obj
     *
     * @return array
     */
    public static function object2array($obj)
    {
        $arr = is_object($obj) ? get_object_vars($obj) : $obj;
        foreach ($arr as $key => $val) {
            $val = (is_array($val) || is_object($val)) ? self::object2array($val) : $val;
            $arr[$key] = $val;
        }

        return $arr;
    }

    /**
     * Description: 对密码进行统一加密算法
     *
     * @param string $password 原始密码
     * @param string $salt     盐值，如果不传，则用 config/app.php中的crypt_salt配置
     *
     * @return string
     */
    public static function encryptPassword(string $password = '', string $salt = ''): string
    {
        $password = md5(sha1(md5(sha1(md5($password . $salt)) . $salt) . $salt));

        return $password;
    }

    /**
     * Description: 替换数组的键，一般用在前端数据提交后，为了避免暴露数据库字段，使用其他名称替代，
     *              然后在程序中，再通过映射规则 矫正过来
     *
     * @param array $data          仅支持一维数组
     * @param array $rules         键的重新替换，值的重新赋值和值的类型转换规则，格式如下：
     *                             ['username'=>['user_name','1000393','int'],...]
     *                             或者 ['username'=>'user_name',...] 如果是字符串，则直接替换键
     *
     *                            解释上面数组：
     *                            [  老键   =>[ '要替换的新建名', '要老键对应的值','转换值的类型']]
     *
     *                            username =  $data原数据中的键
     *                            user_name = 要将 username 替换的新键名
     *                            1000393   = username这个键对应的值重新附的值
     *                            int       = 要将值转换的类型，支持php所有支持的数据类型
     *
     *                            会将data中的 username 替换的值
     *                            替换为 1000393 并转为 int类型，如果省略数组第二个参数int，则不会转化类型
     *
     * @param array $filterFields  要过滤的字段，比如原数据里有 password字段，如果这里指定了['password']，
     *                             则最终结果将不会出现password
     *
     * @param array $excludeFields 排除字段，在此字段的键所对应的值将不进行类型转换和重新赋值
     *
     * @return array
     *
     */
    public static function arrayKeyMap(
        array $data = [],
        array $rules = [],
        array $filterFields = [],
        array $excludeFields = []
    ): array {
        if (empty($data) || ! is_array($data) || empty($rules)) {
            return $data;
        }
        $newData = [];
        $map_keys = array_keys($rules);
        foreach ($data as $key => $value) {
            if (! empty($filterFields) && in_array($key, $filterFields, true)) {
                continue;
            }
            if (in_array($key, $map_keys, true) && ! in_array($key, $excludeFields, true)) {
                $ruleMap = $rules[$key];
                if (is_array($ruleMap)) {
                    $newKey = $ruleMap[0];
                    if (isset($ruleMap[1]) && ! is_null($ruleMap[1])) {
                        $value = $ruleMap[1];
                    }
                    if (isset($ruleMap[2])) {
                        $value = self::exchangeDataType($ruleMap[2], $value);
                    }
                } else {
                    $newKey = $ruleMap;
                }
                $newData[$newKey] = $value;
            } else {
                $newData[$key] = $value;
            }
        }
        unset($map_keys);
        unset($data);
        unset($rules);

        return $newData;
    }

    /**
     * Description: 转换数据类型
     *
     * @param $type
     * @param $value
     *
     * @return bool|float|int|string
     */
    public static function exchangeDataType($type, $value)
    {
        switch (strtolower($type)) {
            case 'int':
            case 'bigint':
                $value = intval($value);
            break;
            case 'string':
                $value = strval($value);
            break;
            case 'double':
                $value = doubleval($value);
            break;
            case 'float':
                $value = floatval($value);
            break;
            case 'bool':
                $value = boolval($value);
            break;
        }

        return $value;
    }

    /**
     * Description: 数据过滤机制 支持自定义规则 格式为
     * 规则定义
     *       $rules=[
     *          'key'=>[rule,replace_data,is_strict]
     *          键名 => [规则(可以为数组), 替换数据, 是否严格匹配(true/false选择，默认false)]
     * ]
     * 如果要删除某些字段，如下设置即可
     *       $rules=[
     *              'name'=>'_del' 表是删除data中name这个字段
     *              'pass'=>'_del' 表是删除data中pass这个字段
     * ]
     *
     * @param array $data  要过滤的数据
     * @param array $rules 过滤的规则 规则定义见上面
     *
     * @return array
     *


     */
    public static function dataFilter(array $data = [], array $rules = []): array
    {
        if (empty($data) || ! is_array($data) || empty($rules)) {
            return $data;
        }
        foreach ($rules as $key => $value) {
            if (! array_key_exists($key, $data)) {
                continue;
            }
            if (is_array($value)) {
                if (is_array($value[0])) {
                    if (isset($value[2]) && $value[2] == true) {

                        if (in_array($data[$key], $value[0], true)) {
                            $data[$key] = $value[1];
                        }
                    } else {
                        if (in_array($data[$key], $value[0])) {
                            $data[$key] = $value[1];
                        }
                    }
                } else {
                    if (isset($value[2]) && $value[2] == true) {
                        if ($data[$key] === $value[0]) {
                            $data[$key] = $value[1];
                        }
                    } else {
                        if ($data[$key] == $value[0]) {
                            $data[$key] = $value[1];
                        }
                    }
                }
            } else {
                // 进行其他操作
                switch (strtolower($value)) {
                    case '_del';
                        if (isset($data[$key])) {
                            unset($data[$key]);
                        }
                    break;
                }
            }
        }

        return $data;
    }

    /**
     * Description: 递归删除多维数组中的指定元素
     *
     * @param array $dataArray    原数组
     * @param array $specificKeys 要删除的数组键指定
     *
     * @return array
     *


     */
    public static function removeArrayElement(array $dataArray, array $specificKeys = []): array
    {
        if (! empty($specificKeys) && ! empty($dataArray)) {
            foreach ($dataArray as $key => &$data) {
                if (! in_array($key, $specificKeys, true) && is_array($data)) {
                    $data = self::removeArrayElement($data, $specificKeys);
                } else {
                    if (in_array($key, $specificKeys, true)) {
                        unset($dataArray[$key]);
                    }
                }
            }
            unset($data);
        }

        return $dataArray;
    }

    /**
     * Description: 向一个数组中的指定关联键后插入新的数组元素
     *
     * @param array $array     原数组
     * @param array $data      新元素，可以为关联数组或非关联数组
     * @param bool $key        指定原数组key，data会添加在原数组的此key的之前或之后，取决于下面参数
     * @param string $position 将新的元素添加到原数组的位置，默认“after”，即指定元素之后，取值 before/after
     *
     * @return array
     *


     */
    public static function arrayElementPush($array, $data = [], $key = false, $position = 'after')
    {
        if (! empty($data)) {
            $data = ! is_array($data) ? (array)$data : $data;
            $offset = ($key === false) ? false : array_search($key, array_keys($array));
            $offset = is_numeric($offset) && $offset >= 0 ? ($position === 'after' ? $offset + 1 : $offset) : false;
            if ($offset) {
                return array_merge(array_slice($array, 0, $offset), $data, array_slice($array, $offset));
            } else {  // 没指定 $key 或者找不到，就直接加到末尾
                return array_merge($array, $data);
            }
        }

        return $array;
    }

    /**
     * Description: 无限级数据tree格式组装
     *
     * @param array $arrays   原数组
     * @param int $pid        要查找的pid 默认从顶级开始查找
     * @param string $pkFlag  主键的标记，不传默认逐渐名字为： id
     * @param string $ppkFlag 父级主键 不传默认为 pid，如果为 parent_id或其他，此项值请传 对应的标记名
     * @param string $sonFlag 组装数据时，下级的key名称，默认son,例如
     *                        A=>[
     *                        'name'=>'aa',
     *                        'son'=>[        // 这里的键即可以通过此参数配置其他名称以满足需求
     *                        'name'=>'bb'
     *                        ]
     *
     * @return array
     */
    public static function unlimitedTree(
        array $arrays,
        int $pid = 0,
        string $pkFlag = 'id',
        string $ppkFlag = 'pid',
        string $sonFlag = 'son'
    ): array {
        $tree = [];
        if (is_array($arrays) && ! empty($arrays)) {
            $arrays = array_column($arrays, null, $pkFlag);
            foreach ($arrays as $array) {
                if (intval($array[$ppkFlag]) === $pid) {
                    $tree[] =& $arrays[$array[$pkFlag]];
                } elseif (isset($arrays[$array[$ppkFlag]])) {
                    $arrays[$array[$ppkFlag]][$sonFlag][] = &$arrays[$array[$pkFlag]];
                }
            }
        }

        return $tree;
    }

    /**
     * Description: 将多维数组转为一维数组，可选择关联键或直接用0开始的数字作为下标
     *
     * @param array $array
     * @param bool $assoc 是否要关联键
     *
     * @return array
     */
    public static function multiArray2LinearArray($array = [], $assoc = true)
    {
        $arr = array ();
        foreach ($array as $key => $val) {
            if (is_array($val)) {
                $arr = array_merge($arr, self::multiArray2OneArray($val));
            } else {
                if ($assoc) {
                    $arr[$key] = $val;
                } else {
                    $arr[] = $val;
                }
            }
        }

        return $arr;
    }

    /**
     * Description: 自动生成密码（保存32位长度)
     *
     * @param string $addChars 要附加的字符
     *
     * @return array
     */
    public static function createPassWord(string $addChars = ''): array
    {
        $randString = $addChars . self::createRandString();
        $md5 = self::encryptPassword($randString);

        return ['password' => $randString, 'encrypt_password' => $md5];
    }

    /**
     * Description: 将星期的数字转为英文
     *
     * @param string|int $weekDay
     *
     * @return mixed|string
     *


     */
    public static function convertWeek2En($weekDay = '')
    {
        $weekMap = [
            'sunday',
            'monday',
            'tuesday',
            'wednesday',
            'thursday',
            'friday',
            'saturday'
        ];
        if (isset($weekMap[$weekDay])) {
            return $weekMap[$weekDay];
        }

        return '';
    }

    /**
     * 转换星期，将数字星期转换为 中文
     *
     * @param string|int $weekDay 传入星期的罗马数字
     *
     * @return array
     *


     */
    public static function convertWeek2CN($weekDay = '')
    {
        $weekMap = [
            '日',
            '一',
            '二',
            '三',
            '四',
            '五',
            '六'
        ];
        if (isset($weekMap[$weekDay])) {
            return $weekMap[$weekDay];
        }

        return '';
    }

    /**
     * Description: 随机生成指定位数的字符串
     *
     * @param int $length   要生成的位数
     * @param bool $special 是否使用特殊字符
     * @param string $type  生成字符串类型，
     *                      默认： mixed 为数字+字母+特殊字符（如果special=true)
     *                      number 为仅生成数字字符串
     *                      alphabet 仅生成大小写字母字符串
     *                      lowercase 仅生成小写字母字符串
     *                      uppercase 仅生成大写字母字符串
     *                      alphabet_number 仅生成大小写字母加数字
     *                      lowercase_number 仅生成小写字母加数字
     *                      upppercase_number 仅生成大写字母加数字
     *
     *
     * @return string
     */
    public static function createRandString(int $length = 10, bool $special = true, string $type = 'mixed'): string
    {
        $chars = [];
        $type = strtolower($type);
        if (in_array($type, ['mixed', 'lowercase', 'alphabet', 'lowercase_number', 'alphabet_number'])) {
            $chars = array_merge($chars, [
                "a",
                "b",
                "c",
                "d",
                "e",
                "f",
                "g",
                "h",
                "i",
                "j",
                "k",
                "l",
                "m",
                "n",
                "o",
                "p",
                "q",
                "r",
                "s",
                "t",
                "u",
                "v",
                "w",
                "x",
                "y",
                "z"
            ]);
        }
        if (in_array($type, ['mixed', 'uppercase', 'alphabet', 'upppercase_number', 'alphabet_number'])) {
            $chars = array_merge($chars, [
                "A",
                "B",
                "C",
                "D",
                "E",
                "F",
                "G",
                "H",
                "I",
                "J",
                "K",
                "L",
                "M",
                "N",
                "O",
                "P",
                "Q",
                "R",
                "S",
                "T",
                "U",
                "V",
                "W",
                "X",
                "Y",
                "Z"
            ]);
        }
        if (in_array($type, ['mixed', 'number', 'upppercase_number', 'lowercase_number', 'alphabet_number'])) {
            $chars = array_merge($chars, [
                "0",
                "1",
                "2",
                "3",
                "4",
                "5",
                "6",
                "7",
                "8",
                "9"
            ]);
        }

        if ($special) {
            $chars = array_merge($chars, array (
                "!",
                "@",
                "#",
                "$",
                "?",
                "|",
                "{",
                "/",
                ":",
                ";",
                "%",
                "^",
                "&",
                "*",
                "(",
                ")",
                "-",
                "_",
                "[",
                "]",
                "}",
                "<",
                ">",
                "~",
                "+",
                "=",
                ",",
                "."
            ));
        }

        $charsLen = count($chars) - 1;
        shuffle($chars);    //打乱数组顺序
        $str = '';
        for ($i = 0; $i < $length; $i++) {
            $str .= $chars[mt_rand(0, $charsLen)];    //随机取出一位
        }

        return $str;
    }

    /** 图片裁剪函数，裁切成指定大小
     *
     * @param string $imgUrl     图片源文件地址
     * @param string $outPutPath 图片输出地址 不带文件名
     * @param string $outPutRule 图片输出文件名
     * @param int $cropW         裁切宽度
     * @param int $cropH         是否移除源文件 true为移除 false为不移除
     * @param bool $RemoveOrigin
     *
     * @return bool|string
     */
    public static function imageResize(
        $imgUrl = '',
        $outPutPath = '',
        $outPutRule = '',
        $cropW = 300,
        $cropH = 200,
        $RemoveOrigin = false
    ) {
        if (empty($outPutPath) || empty($outPutRule)) {
            echo '所需参数缺失，请正确设定';

            return false;
        }
        $outPutRule = $outPutPath . $outPutRule;
        if (! is_dir($outPutPath)) {
            if (! mkdir($outPutPath)) {
                return false;
            }
        }
        if (! empty($imgUrl)) {
            if ($what = getimagesize($imgUrl)) {
                $type = '';
                $outfunc = '';
                $filetype = explode('.', $imgUrl);
                $type = '.' . end($filetype);
                unset($filetype);
                switch (strtolower($what['mime'])) {
                    case 'image/png':
                        $source_image = imagecreatefrompng($imgUrl);
                        $outfunc = "imagepng";
                    break;
                    case 'image/jpeg':
                        $source_image = imagecreatefromjpeg($imgUrl);
                        $outfunc = "imagejpeg";
                    break;
                    case 'image/gif':
                        $source_image = imagecreatefromgif($imgUrl);
                        $outfunc = "imagegif";
                    break;
                    default:
                        die('image type not supported');
                }
                //图像信息获取到
                $imgW = $what[0];
                $imgH = $what[1];
                $jpeg_quality = 100;
                //调整宽高问题
                if ($imgW / $cropW > $imgH / $cropH) {
                    $imgW = $cropW * ($imgH / $cropH);
                } else {
                    $imgH = $cropH * ($imgW / $cropW);
                }
            }
            $resizedImage = imagecreatetruecolor($cropW, $cropH);
            imagecopyresampled($resizedImage, $source_image, 0, 0, 0, 0, $cropW, $cropH, $imgW, $imgH);
            if ($outfunc($resizedImage, $outPutRule . $type, $jpeg_quality)) {
                if ($RemoveOrigin) {
                    unlink($imgUrl);
                }

                imagedestroy($source_image);
                imagedestroy($resizedImage);

                return $outPutRule . $type;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * 去掉表单提交数据中的空白
     */
    public static function rmSpace($value)
    {
        $str = trim($value);
        $str = preg_replace("/\s/", "", $str);

        return $str;

    }

    //将关键词转换
    public static function getKeywords($keywords)
    {
        $keywords = str_replace("-", ",", $keywords);
        $keywords = str_replace("，", ",", $keywords);
        $keywords = str_replace(", ", ",", $keywords);
        //$keywords=str_replace(" ",",",$keywords);
        $keywords = str_replace("|", ",", $keywords);
        $keywords = str_replace("、", ",", $keywords);
        $keywords = str_replace(",,", ",", $keywords);
        $keywords = str_replace("<", "", $keywords);
        $keywords = str_replace(">", "", $keywords);

        return explode(",", trim($keywords));

    }

    /**
     * 只保留字符串首尾字符，隐藏中间用*代替（两个字符时只显示第一个）
     *
     * @param string $idcard 姓名
     *
     * @return string 格式化后的姓名
     */
    public static function idcardCut($idcard, $repeatNum = 8)
    {

        if (empty($idcard)) {
            return false;
        }
        $strlen = strlen($idcard);
        $firstFour = substr($idcard, 0, 6);
        $lastFour = substr($idcard, -4, 4);

        return $firstFour . str_repeat('*', $repeatNum) . $lastFour;

    }

    /**
     * 只保留字符串首尾字符，隐藏中间用*代替（两个字符时只显示第一个）
     *
     * @param string $user_name 姓名
     *
     * @return string 格式化后的姓名
     */
    public static function nameCut($user_name)
    {

        $strlen = mb_strlen($user_name, 'utf-8');
        $firstStr = mb_substr($user_name, -1, 1, 'utf-8');
        $lastStr = mb_substr($user_name, -2, 2, 'utf-8');

        return $strlen == 2 ? str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) . $firstStr : str_repeat("*", $strlen - 2) . $lastStr;

    }

    /**
     *
     * @param unknown_type $str
     * @param unknown_type $beginstartlen 开始截取位置
     * @param unknown_type $beginendlen   开始截取结束位置
     * @param unknown_type $endstartlen   结束截取开始位置
     * @param unknown_type $endendlen     结束截取结束位置
     *
     * @return boolean|string
     *
     * 只保留字符串首尾字符，隐藏中间用*代替（两个字符时只显示第一个）
     */
    public static function strCut(
        $str,
        $beginstartlen = 0,
        $beginendlen = 2,
        $endstartlen = -2,
        $endendlen = 2,
        $repeatNum = 2
    ) {

        if (empty($str)) {
            return false;
        }

        $strlen = mb_strlen($str, 'utf-8');

        $firstStr = mb_substr($str, $beginstartlen, $beginendlen, 'utf-8');

        $lastStr = mb_substr($str, $endstartlen, $endendlen, 'utf-8');

        return $str = $strlen == 2 ? str_repeat('*', mb_strlen($str, 'utf-8') - 1) . $lastStr : $firstStr . str_repeat("*", $repeatNum) . $lastStr;

    }

    /**
     * 只保留字符串首尾字符，隐藏中间用*代替（两个字符时只显示第一个）
     *
     * @param string $phone 手机号
     * @param string $char  替换字符
     *
     * @return string 格式化后的姓名
     */
    public static function phoneCut(string $phone, string $char = '*')
    {
        $firstFour = substr($phone, 0, 3);

        $lastFour = substr($phone, -4, 4);

        return $firstFour . str_repeat($char, 4) . $lastFour;

    }

    /**
     * Description: 将字符串单个字符提出 组合为数组
     *
     * @param $str     字符串
     * @param $charset 编码
     *
     * @return array
     */
    public static function mbstringToArray($str, $charset)
    {

        $strlen = mb_strlen($str);

        while ($strlen) {

            $array[] = mb_substr($str, 0, 1, $charset);

            $str = mb_substr($str, 1, $strlen, $charset);

            $strlen = mb_strlen($str);

        }

        return $array;
    }



    //取出汉字的拼音首字母

    /**
     *
     * @param unknown_type $str
     * @param unknown_type $type 支持strtoupper 和strtolower
     * @param unknown_type $charset
     */
    public static function getPinYinFirstAlphabet($str, $type = 'strtoupper', $charset = 'UTF-8')
    {
        $signalWord = array ();
        $signalWord = self::mbstringToArray($str, $charset);
        foreach ($signalWord as $key => $word) {
            $value = self::Pinyin($word);
            $PinYinFirst[$key] = $type(mb_substr($value, 0, 1, 'UTF-8'));
        }

        return $PinYinFirst;
    }
    /************ BEGIN 汉字转为拼音*************************/

    /**
     * Description: 将汉字转化为拼音  默认编码 UTF-8
     *
     * @param string $_String 要转化的汉字
     * @param string $_Code   要编码  默认为utf-8 *
     *
     * @return mixed
     */
    public static function Pinyin(string $_String, string $_Code = 'UTF-8')
    {

        $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha" . "|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|" . "cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er" . "|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui" . "|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang" . "|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang" . "|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue" . "|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne" . "|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen" . "|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang" . "|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|" . "she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|" . "tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu" . "|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you" . "|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|" . "zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo";
        $_DataValue = "-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990" . "|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725" . "|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263" . "|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003" . "|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697" . "|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211" . "|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922" . "|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468" . "|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664" . "|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407" . "|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959" . "|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652" . "|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369" . "|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128" . "|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914" . "|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645" . "|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149" . "|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087" . "|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658" . "|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340" . "|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888" . "|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585" . "|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847" . "|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055" . "|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780" . "|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274" . "|-10270|-10262|-10260|-10256|-10254";
        $_TDataKey = explode('|', $_DataKey);
        $_TDataValue = explode('|', $_DataValue);
        $_Data = array_combine($_TDataKey, $_TDataValue);
        arsort($_Data);
        reset($_Data);
        if ($_Code != 'gb2312') {
            $_String = self::_U2_Utf8_Gb($_String);
        }
        $_Res = '';
        for ($i = 0; $i < strlen($_String); $i++) {
            $_P = ord(substr($_String, $i, 1));
            if ($_P > 160) {
                $_Q = ord(substr($_String, ++$i, 1));
                $_P = $_P * 256 + $_Q - 65536;
            }
            $_Res .= self::_Pinyin($_P, $_Data);
        }

        return preg_replace("/[^a-z0-9]*/", '', $_Res);
    }

    /**
     * Description: 获取拼音字符
     *
     * @param $_Num
     * @param $_Data
     *
     * @return int|string
     */
    private static function _Pinyin($_Num, $_Data)
    {
        if ($_Num > 0 && $_Num < 160) {
            return chr($_Num);
        } elseif ($_Num < -20319 || $_Num > -10247) {
            return '';
        } else {
            foreach ($_Data as $k => $v) {
                if ($v <= $_Num) {
                    break;
                }
            }

            return $k;
        }
    }

    /**
     * Description: 字符转编码
     *
     * @param $_C
     *
     * @return string
     */
    private static function _U2_Utf8_Gb($_C)
    {
        $_String = '';
        if ($_C < 0x80) {
            $_String .= $_C;
        } elseif ($_C < 0x800) {
            $_String .= chr(0xC0 | $_C >> 6);
            $_String .= chr(0x80 | $_C & 0x3F);
        } elseif ($_C < 0x10000) {
            $_String .= chr(0xE0 | $_C >> 12);
            $_String .= chr(0x80 | $_C >> 6 & 0x3F);
            $_String .= chr(0x80 | $_C & 0x3F);
        } elseif ($_C < 0x200000) {
            $_String .= chr(0xF0 | $_C >> 18);
            $_String .= chr(0x80 | $_C >> 12 & 0x3F);
            $_String .= chr(0x80 | $_C >> 6 & 0x3F);
            $_String .= chr(0x80 | $_C & 0x3F);
        }

        return iconv('UTF-8', 'GB2312', $_String);
    }


    /*********** BEGIN 将时间日期转成上午中午下午晚上等*************/
    /**
     * Description: 将当期那时间转为hello招呼语句前缀
     * @return string
     */
    public static function getHelloWordTime(): string
    {
        $time = date('G');
        if ($time > 5 && $time < 9) {
            $word = '早上';
        } elseif ($time >= 9 && $time < 12) {
            $word = '上午';
        } elseif ($time == 12) {
            $word = '中午';
        } elseif ($time > 12 && $time <= 18) {
            $word = '下午';
        } elseif ($time > 18 && $time <= 23) {
            $word = '晚上';
        } elseif ($time >= 0 && $time <= 5) {
            $word = '凌晨';
        } else {
            $word = '您';
        }

        return $word;
    }

    /**
     * Description:截取UTF8编码字符串从首字节开始指定宽度(非长度), 适用于字符串长度有限的如新闻标题的等宽度截取
     * 中英文混排情况较理想. 全中文与全英文截取后对比显示宽度差异最大,且截取宽度远大越明显.
     *
     * @param string $str UTF-8 encoding
     * @param int $width  [option] $width 截取宽度
     * @param string $end [option] $end 被截取后追加的尾字符
     * @param int $x3     [option] $x3
     *                    <p>3字节（中文）字符相当于希腊字母宽度的系数coefficient（小数）
     *                    中文通常固定用宋体,根据ascii字符字体宽度设定,不同浏览器可能会有不同显示效果</p>
     *
     * @return string
     */
    public static function u8TitleSubstr(string $str, int $width = 0, string $end = '...', int $x3 = 0)
    {
        $e = '';
        global $CFG; // 全局变量保存 x3 的值
        if ($width <= 0 || $width >= strlen($str)) {
            return $str;
        }
        $arr = str_split($str);
        $len = count($arr);
        $w = 0;
        $width *= 10;

        // 不同字节编码字符宽度系数
        $x1 = 11;   // ASCII
        $x2 = 16;
        $x3 = $x3 === 0 ? ($CFG['cf3'] > 0 ? $CFG['cf3'] * 10 : $x3 = 21) : $x3 * 10;
        $x4 = $x3;

        // http://zh.wikipedia.org/zh-cn/UTF8
        for ($i = 0; $i < $len; $i++) {
            if ($w >= $width) {
                $e = $end;
                break;
            }
            $c = ord($arr[$i]);
            if ($c <= 127) {
                $w += $x1;
            } elseif ($c >= 192 && $c <= 223) { // 2字节头
                $w += $x2;
                $i += 1;
            } elseif ($c >= 224 && $c <= 239) { // 3字节头
                $w += $x3;
                $i += 2;
            } elseif ($c >= 240 && $c <= 247) { // 4字节头
                $w += $x4;
                $i += 3;
            }
        }

        return implode('', array_slice($arr, 0, 51)) . $e;
    }

    /**
     * Description: 雪花算法生成随机20位长度的整型数字
     *
     * @param string $machineId 可以传入自己的任意字符串，系统会自动转为唯一机器码
     *
     * @return int
     */
    public static function snowStrCreate(string $machineId = ''): int
    {
        /**
         *  分布式 id 生成类     组成: <毫秒级时间戳+机器id+序列号>
         *  默认情况下41bit的时间戳可以支持该算法使用到2082年，10bit的工作机器id可以支持1023台机器，序列号支持1毫秒产生4095个自增序列id
         * @author zhangqi
         */
        define('EPOCH', 1479533469598);    //开始时间,固定一个小于当前时间的毫秒数
        define('MAX12BIT', 4095);
        define('MAX41BIT', 1099511627775);
        // 机器id  10 字节
        $machineId = self::getMachineId($machineId); // 机器id
        // 时间戳 42字节
        $time = floor(microtime(true) * 1000);
        // 当前时间 与 开始时间 差值
        $time -= EPOCH;
        // 二进制的 毫秒级时间戳
        $base = decbin(MAX41BIT + $time);
        // 序列数 12字节
        $random = str_pad(decbin(mt_rand(0, MAX12BIT)), 12, "0", STR_PAD_LEFT);
        // 拼接
        $base = $base . $machineId . $random;

        // 转化为 十进制 返回
        return bindec($base);
    }

    /**
     * Description: 使用curl模拟file_get_contents 效率更高，稳定性更强
     *              具体介绍参见:  https://www.jb51.net/article/57238.htm
     *
     * @param string $url url地址
     *
     * @return mixed|string
     */
    public static function curl_file_get_contents(string $url)
    {
        $result = '';
        if (! empty($url)) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_TIMEOUT, 30);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $result = curl_exec($ch);
            curl_close($ch);
        }

        return $result;
    }

    /**
     * Description: 数据大小单位自动转换，
     *
     * @param float $size 输入字节数
     *
     * @return string
     */
    public static function formatDataSize(float $size): string
    {
        $sizes = array ('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');

        if ($size == 0) {
            return '0 B';
        } else {
            return round($size / pow(1024, ($i = floor(log($size, 1024)))), 1) . ' ' . $sizes[$i];
        }
    }

    /**
     * Description: 格式化金额
     *
     * @param int $money   原金额
     * @param int $decimal 小数位数
     * @param string $sign 前缀金额符号，如： $ ￥等
     *
     * @return string
     * @Author itworker
     * @Time   2021/8/8 22:43
     */
    /**
     * Description: 格式化金额
     *
     * @param float $money         原金额
     * @param int $decimal         小数位数
     * @param string $thousandChar 千分位分隔符
     * @param string $sign         前缀金额符号，如： $ ￥等
     *
     * @return string
     * @Author itworker
     * @Time   2021/8/8 22:43
     */
    public static function moneyFormat(float $money, int $decimal = 2, string $thousandChar = '', string $sign = '')
    {
        $negative = $money >= 0 ? '' : '-';
        $int_money = intval(abs($money));
        $decimal = intval(abs($decimal));
        $decimalStr = '';//小数
        if ($decimal > 0) {
            $decimalStr = '.' . substr(sprintf('%01.' . $decimal . 'f', $money), -$decimal);
        }
        $tmp_money = strrev($int_money);
        $strlen = strlen($tmp_money);
        $format_money = '';
        for ($i = 3; $i < $strlen; $i += 3) {
            $format_money .= substr($tmp_money, 0, 3) . $thousandChar;
            $tmp_money = substr($tmp_money, 3);
        }
        $format_money .= $tmp_money;
        $format_money = strrev($format_money);

        return $sign . $negative . $format_money . $decimalStr;
    }

    /**
     * 创建某个时间点的时间
     *
     * @param string $format
     * @param string $type
     *
     * @return string
     */
    public static function createDate($format = 'Y-m-d H:i:s', $type = 'now'): string
    {
        switch ($type) {
            case 'now':
            default:
                $timestamp = time();
        }

        return date($format, $timestamp);
    }

    /**
     * 时间戳转为具体时分秒
     *
     * @param $time
     * @param string $dayUnit
     * @param string $hourUnit
     * @param string $minuteUnit
     * @param string $secondUnit
     *
     * @return string
     */
    public static function formatTime(
        $time,
        string $dayUnit = '天',
        string $hourUnit = '小时',
        string $minuteUnit = '分',
        string $secondUnit = '秒'
    ): string {
        $minute = 60;
        $hour = $minute * 60;
        $day = $hour * 24;

        $when = $time;

        if ($when > $day) {
            $tmpday = floor($when / $day);
            $tmphour = floor(($when / $hour) - (24 * $tmpday));
            $tmpminute = floor(($when / $minute) - (24 * 60 * $tmpday) - ($tmphour * 60));
            $tmpsec = floor($when - (24 * 60 * 60 * $tmpday) - ($tmphour * 60 * 60) - ($tmpminute * 60));

            return sprintf("%d {$dayUnit} %d {$hourUnit} %d {$minuteUnit} %d {$secondUnit}", $tmpday, $tmphour, $tmpminute, $tmpsec);
        } elseif ($when > $hour) {
            $tmphour = floor($when / $hour);
            $tmpminute = floor(($when / $minute) - ($tmphour * 60));
            $tmpsec = floor($when - ($tmphour * 60 * 60) - ($tmpminute * 60));

            return sprintf("%d {$hourUnit} %d {$minuteUnit} %d {$secondUnit}", $tmphour, $tmpminute, $tmpsec);
        } elseif ($when > $minute) {
            $tmpminute = floor($when / $minute);
            $tmpsec = floor($when - ($tmpminute * 60));

            return sprintf("%d {$minuteUnit} %d {$secondUnit}", $tmpminute, $tmpsec);
        } else {
            return sprintf("%d {$secondUnit}", $when);
        }
    }

    /**
     * Description: 循环创建多级目录
     *
     * @param $dir
     * @param $mode
     *
     * @return bool
     */
    public static function makeDirs($dir = '', $mode = 0644)
    {
        if (! is_dir($dir)) {
            if (! self:: makeDirs(dirname($dir))) {
                return false;
            }
            if (! mkdir($dir, $mode)) {
                return false;
            }
        }

        return true;
    }

    /**
     * 扫描目录下的文件并获得文件名
     *
     * @param string $path
     *
     * @return array
     */
    public static function scanDir(string $path = ''): array
    {
        $files = [];
        if (! empty($path)) {
            $handler = opendir($path);
            while (($filename = readdir($handler)) !== false) {
                //3、目录下都会有两个文件，名字为’.'和‘..’，不要对他们进行操作
                if ($filename != "." && $filename != "..") {
                    //4、进行处理
                    //这里简单的用echo来输出文件名
                    $files[] = $filename;
                }
            }
        }

        return $files;
    }

    /**
     * Description: 加密码时把特殊符号替换成URL可以带的内容
     *
     * @param string $string
     *
     * @return mixed|string
     */
    public static function safeBase64Encode(string $string)
    {
        $data = base64_encode($string);
        $data = str_replace(array ('+', '/', '='), array ('-', '_', ''), $data);

        return $data;
    }

    /**
     * Description: 解密码时把转换后的符号替换特殊符号
     *
     * @param string $string
     *
     * @return mixed|string
     */
    public static function safeBase64Decode($string)
    {
        $data = str_replace(array ('-', '_'), array ('+', '/'), $string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }

        return base64_decode($data);
    }

    /**
     * Description: 签名生成
     *
     * @param array $data
     *
     * @return string
     * @Author Bililovy
     * @Time   2022/10/15 下午5:32
     */
    public static function createSign(array $data): string
    {
        $string = '';
        if (! empty($data)) {
            ksort($data);
            foreach ($data as $key => $val) {
                $string .= $key . '=' . $val . '&';
            }
            $string = rtrim($string, '&');
            $string = strtoupper(md5(md5($string . env('SIGN_KEY', 'bkbpay') . $string)));
        }

        return $string;
    }

    /**
     * Description: 获取机器码
     *
     * @param string $machineId 可以传入自己的任意字符串，系统会自动转为唯一机器码
     *
     * @return string
     */
    private static function getMachineId(string $machineId = ''): string
    {
        // 机器码可以使用特定方式获取，目前我们随机
        if (! empty($machineId)) {
            // 使用认为传入的字符串生成机器码
            $machineNumStr = '';
            $strLen = strlen($machineId);
            for ($i = 0; $i < $strLen; $i++) {
                $ord = strval(ord($machineId[$i]));
                $ordLen = strlen($ord);
                $machineNumLen = strlen($machineNumStr);
                $diffLen = 10 - $machineNumLen;
                if ($diffLen === 0) {
                    // 已经满足10位 直接累加
                    $machineNumStr = strval(intval($machineNumStr) + intval($ord));
                } else {
                    // 不满足10位 直接追加
                    $machineNumStr .= substr($ord, 0, $diffLen);
                }
                unset($ord, $ordLen, $machineNumLen, $diffLen);
            }
            $machineNum = intval($machineNumStr);
            unset($machineNumStr);
        } else {
            $machineNum = intval(self::createRandString(10, false, 'number'));
        }

        $return = str_pad(decbin(mt_rand(1, $machineNum)), 10, "0", STR_PAD_LEFT);

        return $return;
    }
}
